package com.lyb.statement.impl;

import com.lyb.Utils;
import com.lyb.constant.SystemConstant;
import com.lyb.statement.ExecutableStatement;

import java.util.Map;

/**
 * "自增"语句的处理类
 *
 * @author Mr.Alpaca potato
 * @version 1.4.0
 */
public class AdditionStatement implements ExecutableStatement {
    /**
     * 表示该类负责处理的可执行语句字符串
     * 注："++"若用在String.split()中，会被系统识别为正则表达式
     */
    private final static String STATEMENT = "++";
    /**
     * "++"专属正则表达式
     */
    private final static String REGEX = "[+][+]";

    public AdditionStatement() {
    }

    /**
     * 格式判断，输入语句需满足格式为：
     * 1."变量名++"
     * 2.变量名以字母开头
     *
     * @param row   当前语句行数
     * @param input 输入语句
     * @return 判断结果
     */
    @Override
    public boolean formatJudge(int row, String input) {
        /* 将语句按"++"切分后判断 */
        String[] split = input.split(REGEX);
        /* 若无变量或多个变量则格式错误 */
        if (split.length != 1) {
            Utils.log("[系统|编译器]: 第 " + row + " 行: \"" + input + "\" 语句格式错误");
            return false;
        }
        /* 若变量不是字母开头则错误 */
        if (!Character.isLowerCase(split[0].charAt(0)) && !Character.isUpperCase(split[0].charAt(0))) {
            Utils.log("[系统|编译器]: 第 " + row + " 行: 参数 \"" + split[0] + "\" 不是合法变量名");
            return false;
        }
        return true;
    }

    /**
     * 执行该可执行语句,将变量(key)的值(value)+1后储存到Map中
     * 若Map中无该变量则跳过该语句的执行
     *
     * @param statement   输入语句
     * @param variableMap 储存各变量值
     */
    @Override
    public void execute(String statement, Map<String, Double> variableMap) {
        /* 获取自增语句的变量 */
        String[] split = statement.split(REGEX);
        /* 若储存变量的Map中存在该变量则将其值+1，反之则不执行该语句 */
        Double value = variableMap.get(split[0]);
        if (value != null) {
            variableMap.put(split[0], ++value);
        }
    }

    /**
     * 获得该类负责处理的可执行语句字符串
     *
     * @return 可执行语句字符串
     */
    @Override
    public String getStatement() {
        return STATEMENT;
    }
}
